package cn.tedu.core;

import cn.tedu.http.HttpRequest;
import cn.tedu.http.HttpResponse;
import cn.tedu.servlet.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * Author：程Sir
 * Name： SmallServer
 * Content:
 * 统一管理标准（接口 interface）
 */
public abstract class ServerServlet {

    public abstract void service(HttpRequest request, HttpResponse response);

    // 用来存储请求路径和具体servlet的对应关系（映射）
    private static Map<String,ServerServlet> map = new HashMap<>();

    //初始化
    static {
//        initMapOther();
        initMap();
    }


    public static void main(String[] args) {
        initMap();
    }

    /**
     * 初始化map的方法，方式一
     */
    public static void initMap(){
        // 解析servlets.xml文件
        Document document = null;
        try {
            document = Jsoup.parse(new File("./config/servlets.xml"), "utf-8");

            // 获取元素集合
            Elements elements = document.getElementsByTag("servlet");
            // 遍历集合
            for (Element element : elements){
                // 获取url标签对象
                Elements url = element.getElementsByTag("url");
                // 通过url标签对象获取该标签的文本内容
                String text1 = url.text();
                System.out.println(text1);

                // 获取url标签对象
                Elements className = element.getElementsByTag("className");
                // 通过url标签对象获取该标签的文本内容
                String text2 = className.text();
                System.out.println(text2);
                // 获取类名称对应的类对象
                Class name = Class.forName(text2);
                // 通过类对象来创建具体对象
                Object object = name.newInstance();

                ServerServlet servlet = (ServerServlet)object;

                // 将key和value放入集合
                map.put(text1, servlet);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化Map的方法。方式二
     */
    private static void initMapOther() {
        map.put("/myweb/register.do", new RegisterServlet());
        map.put("/myweb/login.do", new LoginServlet());
        map.put("/myweb/updateUser.do", new UpdateUserServlet());
        map.put("/myweb/toUpdate.do", new ToUpdateUserServlet());
        map.put("/myweb/showAllData.do", new ShowAllDataServlet());
    }
    /**
     * 通过传入的请求路径，反馈对应的servlet处理对象
     * @param url 传入的请求路径
     * @return 返回对应的servlet对象，不存在时返回null
     */
    public static ServerServlet getServlet(String url) {
        return map.get(url);
    }

}
